package cn.wolfcode.luowowo.util;

import cn.wolfcode.luowowo.domain.Region;
import org.springframework.data.domain.*;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.util.StringUtils;

import java.lang.reflect.Method;
import java.util.List;

public class DBHelper {


    /**
     * 通用分页,条件查询
     * @param mongoTemplate
     * @param query
     * @param tClass
     * @param pageable
     * @param <T>
     * @return
     */
    public static <T> Page<T> PagingQuery(MongoTemplate mongoTemplate , Query query , Class<T> tClass , Pageable pageable){
        //条件查询的总条数
        long total = mongoTemplate.count(query, tClass);
        //如果0条数据则返回空分页对象
        if(total == 0){
            return Page.empty();
        }
        //分页参数设置进查询对象中
        query.with(pageable);
        //条件查询的数据集
        List<T> list = mongoTemplate.find(query, tClass);
        //返回page对象
        return new PageImpl<T>(list,pageable,total);
    }

    /**
     * 通用局部字段更新
     * @param collection    文档实例对象
     * @param mongoTemplate mongodb操作对象
     * @param query 条件对象
     * @param fields 需要更新的字段集
     */
    public static void update(Object collection , MongoTemplate mongoTemplate, Query query , String... fields){
        Update update =  new Update();
        //获取文档实例对象的字节码对象
        Class<?> aClass = collection.getClass();
        //遍历需要更新的字段集
        for (String field : fields) {
            if (StringUtils.hasLength(field)){
                //分割字段名,从第个开始截取,截取1个,变大写
                String s1 = field.substring(0, 1).toUpperCase();
                //第二个开始截取,截全部
                String s2 = field.substring(1, field.length());
                try {
                    //反射获取get方法
                    Method getMd = aClass.getMethod("get" + s1 + s2);
                    //调用方法获得要更新的字段对应的值设置进更新对象
                    update.set(field , getMd.invoke(collection));
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        //执行更新
        mongoTemplate.updateFirst(query , update , aClass);

    }
}